package com.net.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;
import org.apache.http.util.EncodingUtils;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.widget.Toast;

/*  */

public class mService1 extends Service {
	private Handler objHandler = new Handler();
	private int intCounter = 0;
	private int mHour;
	private int mMinute;
	private int mYear;
	private int mMonth;
	private int mDay;
	private String mdate;

	final public String DEV_FILE = "/proc/self/net/dev";// 系统流量文件
	String[] ethdata = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0",
			"0", "0", "0", "0", "0" };
	String[] gprsdata = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0",
			"0", "0", "0", "0", "0", "0" };
	String[] wifidata = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0",
			"0", "0", "0", "0", "0", "0" };
	String data = "0,0,0,0,0,0,0,0,0,0,0,0";// 对应on.txt里面的格式

	final String ETHLINE = "  eth0";// eth是以太网信息 tiwlan0 是 Wifi rmnet0 是 GPRS
	final String GPRSLINE = "rmnet0";
	// 转载时此处为tiwlan0， 但发现在我的2.1的手机上为wlan0
	final String WIFILINE = " wlan0";
	final String TEXT_ENCODING = "UTF-8";
	final public String ONPATH = "/data/data/zy.dnh/on.txt";
	final public String LOGPATH = "/data/data/zy.dnh/log.txt";

	private Runnable mTasks = new Runnable() {
		public void run()// 运行该服务执行此函数
		{
			refresh();
			intCounter++;
			// DisplayToast("Counter:"+Integer.toString(intCounter));
			objHandler.postDelayed(mTasks, 3000);// 每3000毫秒执行一次
		}
	};

	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		objHandler.postDelayed(mTasks, 0);
		super.onStart(intent, startId);
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		/*  */
		objHandler.removeCallbacks(mTasks);
		super.onDestroy();
	}

	public void DisplayToast(String str) {
		Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
	}

	public void readdev() {
		FileReader fstream = null;
		try {
			fstream = new FileReader(DEV_FILE);
		} catch (FileNotFoundException e) {
			DisplayToast("Could not read " + DEV_FILE);
		}

		BufferedReader in = new BufferedReader(fstream, 500);
		String line;
		String[] segs;
		String[] netdata;
		int count = 0;
		int k;
		int j;
		try {
			while ((line = in.readLine()) != null) {
				segs = line.trim().split(":");
				if (line.startsWith(ETHLINE)) {
					netdata = segs[1].trim().split(" ");
					for (k = 0, j = 0; k < netdata.length; k++) {
						if (netdata[k].length() > 0) {
							ethdata[j] = netdata[k];
							j++;
						}
					}
				} else if (line.startsWith(GPRSLINE)) {
					netdata = segs[1].trim().split(" ");
					for (k = 0, j = 0; k < netdata.length; k++) {
						if (netdata[k].length() > 0) {
							gprsdata[j] = netdata[k];
							j++;
						}
					}
				} else if (line.startsWith(WIFILINE)) {
					netdata = segs[1].trim().split(" ");
					for (k = 0, j = 0; k < netdata.length; k++) {
						if (netdata[k].length() > 0) {
							wifidata[j] = netdata[k];
							j++;
						}
					}
				}
				count++;
			}

			fstream.close();
		} catch (IOException e) {
			DisplayToast(e.toString());
		}

	}

	public String getinfo(String path) {
		File file;
		String str = "";
		FileInputStream in;
		try {
			// 打开文件file的InputStream
			file = new File(path);
			in = new FileInputStream(file);
			// 将文件内容全部读入到byte数组
			int length = (int) file.length();
			byte[] temp = new byte[length];
			in.read(temp, 0, length);
			// 将byte数组用UTF-8编码并存入display字符串中
			str = EncodingUtils.getString(temp, TEXT_ENCODING);
			// 关闭文件file的InputStream
			in.close();
		} catch (IOException e) {
			DisplayToast(e.toString());
		}

		return str;
	}

	public void writefile(String str, String path) {
		File file;
		FileOutputStream out;
		try {
			// 创建文件
			file = new File(path);
			file.createNewFile();
			// 打开文件file的OutputStream
			out = new FileOutputStream(file);
			String infoToWrite = str;
			// 将字符串转换成byte数组写入文件
			out.write(infoToWrite.getBytes());
			// 关闭文件file的OutputStream
			out.close();
		} catch (IOException e) {
			// 将出错信息打印到Logcat
			DisplayToast(e.toString());
		}
	}

	public void refresh() {
		readdev();// 读取本次开机之后直到当前系统的总流量
		data = ethdata[0] + "," + ethdata[1] + "," + ethdata[8] + ","
				+ ethdata[9] + "," + gprsdata[0] + "," + gprsdata[1] + ","
				+ gprsdata[8] + "," + gprsdata[9] + "," + wifidata[0] + ","
				+ wifidata[1] + "," + wifidata[8] + "," + wifidata[9];

		String onstr = getinfo(ONPATH);// 读取on.txt记录到onstr里
		String ondata[] = onstr.split(",");// 将onstr各项分离 放到ondata里
		// 计算增量

		int[] delta = new int[12];
		delta[0] = Integer.parseInt(ethdata[0]) - Integer.parseInt(ondata[0]);
		delta[1] = Integer.parseInt(ethdata[1]) - Integer.parseInt(ondata[1]);
		delta[2] = Integer.parseInt(ethdata[8]) - Integer.parseInt(ondata[2]);
		delta[3] = Integer.parseInt(ethdata[9]) - Integer.parseInt(ondata[3]);
		delta[4] = Integer.parseInt(gprsdata[0]) - Integer.parseInt(ondata[4]);
		delta[5] = Integer.parseInt(gprsdata[1]) - Integer.parseInt(ondata[5]);
		delta[6] = Integer.parseInt(gprsdata[8]) - Integer.parseInt(ondata[6]);
		delta[7] = Integer.parseInt(gprsdata[9]) - Integer.parseInt(ondata[7]);
		delta[8] = Integer.parseInt(wifidata[0]) - Integer.parseInt(ondata[8]);
		delta[9] = Integer.parseInt(wifidata[1]) - Integer.parseInt(ondata[9]);
		delta[10] = Integer.parseInt(wifidata[8])
				- Integer.parseInt(ondata[10]);
		delta[11] = Integer.parseInt(wifidata[9])
				- Integer.parseInt(ondata[11]);

		// 读取log.txt
		// 获取当前时间
		final Calendar c = Calendar.getInstance();
		mYear = c.get(Calendar.YEAR); // 获取当前年份
		mMonth = c.get(Calendar.MONTH) + 1;// 获取当前月份
		mDay = c.get(Calendar.DAY_OF_MONTH);// 获取当前月份的日期号码
		mHour = c.get(Calendar.HOUR_OF_DAY);// 获取当前的小时数
		mMinute = c.get(Calendar.MINUTE);// 获取当前的分钟数
		mdate = mYear + "-" + mMonth + "-" + mDay;
		String text = getinfo(LOGPATH);// 将log.txt的内容读到text字符串中
		String[] line = text.split("/n");
		String today = line[line.length - 1];// 获得今日已记录流量
		String[] beToday = today.split(",");

		// 检查文件最后一行是否为今天的流量记录信息
		if (!beToday[0].equals(mdate))// 如果文件只有一行，表明目前日志为空，将当前日期加入
		// 判断今日流量是否已经记录,如果今日流量没有记录
		{
			text = text + mdate + ",0,0,0,0,0,0,0,0,0,0,0,0/n";
			writefile(text, LOGPATH);
			line = text.split("/n");
			today = line[line.length - 1];// 获得今日已记录流量
			beToday = today.split(",");
		}

		int i;
		// 处理今日流量
		int[] newTodaydata = new int[12];// 表示今日流量
		String newtoday = mdate;
		for (i = 0; i <= 11; i++) {
			newTodaydata[i] = Integer.parseInt(beToday[i + 1]) + delta[i];
			newtoday = newtoday + "," + newTodaydata[i];
		}

		newtoday = newtoday + "/n";
		String[] beTotal = line[0].split(",");
		int[] newTotaldata = new int[12];// 表示总流量数值
		// 更新第一行
		String newtotal = "total";
		for (i = 0; i <= 11; i++) {
			newTotaldata[i] = Integer.parseInt(beTotal[i + 1]) + delta[i];// 总流量数值+delta[i]更新
			newtotal = newtotal + "," + newTotaldata[i];
		}

		newtotal = newtotal + "/n";
		// 处理中间不变的部分
		String before = "";// before为之前的从第1行到昨天的流量记录
		for (i = 1; i <= line.length - 2; i++)
			before = before + line[i] + "/n";// 代表中间不变的部分

		String newlog = newtotal + before + newtoday;
		writefile(data, ONPATH);// 更新流量记录
		writefile(newlog, LOGPATH);// 更新log*/
	}
}
